package Command;

public class CommandPattern {
    public static void main(String[] args) {
        Command command = new ConcreteCommand();
        Invoker invoker = new Invoker(command);
        System.out.println("使用调用者...");
        invoker.call();
    }
}
//调用者
class Invoker{
    private Command command;
    public Invoker(Command command){
        this.command = command;
    }
    public void setCommand(Command command){
        this.command = command;
    }
    public void call(){
        System.out.println("调用者执行命令...");
        command.execute();
    }
}
//抽象命令
interface Command{
    public abstract void execute();
}
//具体命令
class ConcreteCommand implements Command{
    private Receiver receiver;

    public ConcreteCommand() {
        receiver = new Receiver();
    }

    @Override
    public void execute() {
        receiver.action();
    }
}
//接收者
class Receiver{
    public void action(){
        System.out.println("接收者动作");
    }
}

/**
 * 命令模式的应用场景:
 *
 * 命令模式通常适用于以下场景。
 * 当系统需要将请求调用者与请求接收者解耦时，命令模式使得调用者和接收者不直接交互。
 * 当系统需要随机请求命令或经常增加或删除命令时，命令模式比较方便实现这些功能。
 * 当系统需要执行一组操作时，命令模式可以定义宏命令来实现该功能。
 * 当系统需要支持命令的撤销（Undo）操作和恢复（Redo）操作时，可以将命令对象存储起来，采用备忘录模式来实现。
 *
 *
 * 命令模式的扩展:
 * 在软件开发中，有时将命令模式与前面学的组合模式联合使用，这就构成了宏命令模式，也叫组合命令模式。
 * 宏命令包含了一组命令，它充当了具体命令与调用者的双重角色，执行它时将递归调用它所包含的所有命令，
 */












